package org.example;

import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.realm.AuthenticatingRealm;
import org.apache.shiro.util.ByteSource;

// 自定义Realm，继承自AuthenticatingRealm
public class MyRealm extends AuthenticatingRealm {

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        // 从token中获取用户名
        String principal = token.getPrincipal().toString();
        // 从token中获取密码
        String password = new String((char[]) token.getCredentials());
        // 打印用户名和密码，用于调试
        System.out.println("user info:" + principal + "---" + password);

        // 进行身份验证
        if ("zhangsan".equals(principal)) {
            // 这里应该是从数据库或其他数据源获取的加密后的密码
            String pwdInfo = "7174f64b13022acd3c56e2781e098a5f";
            // 创建并返回一个SimpleAuthenticationInfo对象
            return new SimpleAuthenticationInfo(
                    token.getPrincipal(),  // 身份，通常是用户名
                    pwdInfo,               // 证书，通常是密码
                    ByteSource.Util.bytes("salt"), // 盐值，用于密码加密，增加安全性
//                    getName()              // Realm的名称，用于区分多个Realm
                    principal
            );
        }
        System.out.println("用户名不匹配, Realm无法处理此认证请求.......");
        // 如果用户名不匹配，返回null，表示该Realm无法处理此认证请求
        return null;
    }
}